Java Blog

Since I'm very lazy in sharing my thoughts, this blog may contain very few posts - so please be patient! :-)

Donnerstag, März 08, 2007

Java Exception Architektur

Nach dem Studium eines interessanten Artikels auf dev2dev habe ich mir nun meine eigene Meinung zum Exception Handling in Java-Anwendungen gebildet.
Vielerorts wird ziemlich kontrovers über dieses Thema diskutiert und hier ist nun mein Beitrag dazu.

Die grobe Unterteilung in Checked und Unchecked Exceptions lässt sich relativ gut auf die Schnittstellen und technischen Rahmenbedingungen innerhalb einer Java EE Anwendung abbilden.

Checked Exceptions

Dieser Typ von Exceptions - also alle direkten Ableitungen von java.lang.Exception - sollte nur dann Verwendung finden, wenn sie zu der definierten Schnittstelle einer Methode gehören. In diesem Fall stellen sie ein erwartetes Fehlverhalten der betreffenden Methode dar, welches aus der Implementierung und den aktuellen Eingabeparametern der Methode resultiert.
Diese Exceptions werden mittels throws an der Signatur der Methode spezifiziert und repräsentieren negative Ergebnisse der Methode, die vom Aufrufer behandelt werden MÜSSEN. Wichtig dabei ist also, dass der Aufrufer mit diesen negativen Ergebnissen der Methode auch umgehen KANN.
Ein populäres Beispiel ist eine AccountOverdrawException einer Methode zum Abheben von einem Konto. Die Möglichkeit des Auftretens des Fehlers "Konto ist überzogen" wird hier bereits durch die Methodensignatur kommuniziert:

public void withdraw(Account account, double amount) throws AccountOverdrawnException, ... {
...
}

- these failures have to be handled by the caller - so there must be something the client can do to recover from this situation

Unchecked Exceptions

Unerwartete Fehlersituationen, die Situationen repräsentieren, die völlig unabhängig von der internen Implementierung bzw. den Eingabeparametern einer Methode sind, sollten als Unchecked Exceptions - also direkte Ableitungen von java.lang.RuntimeException - implementiert werden.
Beispiele hierfür sind Fehler in der Software oder in der Ausführungsumgebung, z. B. Datenbankfehler.

Fazit

Als Fazit kann man gut eine Richtlinie aus Sun's Exception Tutorial verwenden:

If a client can reasonably be expected to recover from an exception, make it a checked exception.
If a client cannot do anything to recover from the exception, make it an unchecked exception.

Weitere Meinungen und Referenzen

Alan Griffiths hat seine eigenen Erfahrungen, die sich wie folgt zusammenfassen lassen: Unchecked Exceptions sollten sparsam eingesetzt werden...

Bruce Eckel ("Thinking in Java") steht auf dem Standpunkt: Checked Exceptions are not needed at all - auch eine interessante Diskussion!
Sein Fazit: gar keine eigenen Checked Exceptions verwenden und alle Checked Exceptions des JDKs bzw. von Dritthersteller-Bibliotheken mit einem speziellen ExceptionAdapter wrappen, der sich von java.lang.RuntimeException ableitet.

Dieser Standpunkt hat auch etwas für sich - als Beispiel sei hier die SQLException als Checked Exception der JDBC API zu nennen:
Wenn der Datenzugriffscode z. B. sich zu etwas entwickelt, das KEINE Datenbank (sondern z. B. einen Web-Service) benutzt, besteht das Problem, die eigene Schnittstelle zur Persistenzschicht ändern zu müssen, wenn dort bisher die SQLException einfach nur propagiert wurde. Wenn diese Checked Exception in etwas Allgemeineres - oder gar eine Unchecked Exception umgewandelt würde, könnte die Anpassung der eigenen API vermieden werden.

Labels:

2 Comments:

  • At 9:44 AM, Anonymous Anonym said…

    Ich sehe das ähnlich wie das Sun Exceptions Tutorial. Als Richtlinie: bei fachlichen Fehlern eine checked exception, bei technischen Fehlern eine unchecked exception. Spring z.B. (als technisches Framework) verwendet auch nur unchecked exceptions. Interessante Diskussionen zu diesem Thema auch auf dem C2-Wiki (http://c2.com/cgi/wiki?CategoryException).

    In meinem aktuellen Projekt gibt es aus historischen Gründen eine checked "Projekt" exception, so dass so ziemlich alle Signaturen damit "verschmutzt" sind. Problematisch an diesem Ansatz finde ich übrigens auch, dass Fehler mehrfach geloggt werden, weil man ja an jeder Stelle im Stack entscheiden muss, was man mit beim Auftreten der entsprechenden Stelle macht und dies einer einheitlichen Fehlerbehandlung zuwider läuft. Dies bläht nicht nur das Log-File auf, sondern macht die Fehlerverfolgung für den Betrieb oder eine automatische Statistik über die aufgetretenen Fehler schwerer.

    Eine interessante Idee auch in Siedersleben "Softwarearchitektur": eine "Sicherheitsfacade", die die interne Ausnahmebehandlung einer Komponente zentralisiert. Siedersleben schlägt im Übrigen vor, unchecked exceptions für "abnorme Ergebnisse" zu verwenden, die selten auftreten. Checked Exception dagegen für normale Ergebnisse, wenn diese nicht als Rückgabewert übergeben werden. Dies passt denke ich für meine obige Regel.

    Soweit zum fachlichen Teil, nun zum persönlichen: Hallo René, ich finde Dein Java-Blog prima! Habe auch ein Blog mit teilweise java-Themen (http://www.epischel.de/wordpress), allerdings finde ich wenig Zeit dafür weil ich auf Arbeit wenig Zeit dafür habe und in meiner Freizeit meist nicht genug Muße (sprich genügend lange Konzentration) habe. Weiter so! :-)

     
  • At 2:36 PM, Blogger Marco Loco said…

    Hi,

    guter Blog Eintrag zum Thema! Ich versuche gerade eine Vorgabe für das Exception Handling für mein aktuelles Projekt zu schreiben, und da hat mir Deine Diskussion weiter geholfen.

    Das Beispiel mit der AccountOverdrawnException hat mir richtig gut gefallen, da ich zum ersten Mal eine sinnvolle Verwendung von checked Exceptions gesehen habe. In den meisten Projekten werden checked Exceptions für technische Fehler - Programmierfehler - benutzt. Da man auf diese nicht sinnvoll reagieren kann, ist es Zeitverschwendung, sie in der Signatur zu definieren.

    Auch die Richtlinie "bei fachlichen Fehlern eine checked exception, bei technischen Fehlern eine unchecked exception" von Erik gefällt mir, das ist sehr gut auf den Punkt gebracht.

    Danke!

     

Kommentar veröffentlichen

<< Home